package com.deploy;

import com.deploy.model.ServerInfo;
import com.deploy.service.DeploymentService;
import com.deploy.util.SSHUtil;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Paths;
import java.util.*;


/**
 * 部署应用程序主类
 * 负责程序入口和用户交互
 */
@Slf4j
public class DeploymentApplication {

    public static void main(String[] args) {
        log.info("启动部署工具");
        try {
            // 读取服务器信息
            List<ServerInfo> serverList = readServerInfoInteractive();
            if (serverList.isEmpty()) {
                log.error("没有配置服务器信息");
                return;
            }
            // 执行部署
            deployToServers(serverList);
        } catch (Exception e) {
            log.error("部署过程中发生错误: {}", e.getMessage(), e);
        }
    }


    /**
     * 执行部署
     *
     * @param serverList 服务器列表
     */
    private static void deployToServers(List<ServerInfo> serverList) {
        DeploymentService deploymentService = new DeploymentService();
        // 执行部署
        log.info("执行部署");
        int successCount = deploymentService.deployToServers(serverList);
        // 部署结果
        log.info("部署结果：");
        log.info("成功: " + successCount + "/" + serverList.size() + " 个服务器");
    }

    /**
     * 交互式读取服务器信息
     *
     * @return 服务器信息列表
     */
    private static List<ServerInfo> readServerInfoInteractive() {
        // 服务器列表
        List<ServerInfo> serverList = new ArrayList<>();
        // Linux服务器信息
        serverList.add(ServerInfo.builder().ip("47.108.167.222").username("root").password("LEOleo673673.LEO").port(22).build());
        // Windows服务器信息
        serverList.add(ServerInfo.builder().ip("43.136.168.231").username("administrator").password("LEOleo673673.LEO").port(22).build());
        // 服务器信息遍历，根据服务器系统类型存入对应本地部署文件路径，存入对应目标服务器路径
        serverList.stream().forEach(item -> {
            Session session = null;
            try {
                // 创建一个session
                session = SSHUtil.createSession(item);
                // 检测操作系统类型
                ServerInfo.OsType detectedOsType = SSHUtil.detectOsType(session);
                item.setOsType(detectedOsType);
                String currentDir = System.getProperty("user.dir");
                // 判断是windwos还是Linux
                if (detectedOsType == ServerInfo.OsType.WINDOWS) {
                    item.setDeployPath("C:\\agent\\");
                    item.setCurrentAgentFilePath(Paths.get(currentDir, "software/agent.exe").toString()); // 设置完整文件路径
                    item.setCurrentConfigFilePath(Paths.get(currentDir, "software/application.yaml").toString()); // 设置完整配置文件路径
                } else {
                    item.setDeployPath("/home/software/");
                    item.setCurrentAgentFilePath(Paths.get(currentDir, "software/agentLinux").toString()); // 设置完整文件路径
                    item.setCurrentConfigFilePath(Paths.get(currentDir, "software/application.yaml").toString()); // 设置完整配置文件路径
                }
            } catch (JSchException e) {
                log.info("连接服务器{}失败：{}", item.getIp(), e.getMessage());
            } finally {
                SSHUtil.closeSession(session);
            }
        });
        return serverList;
    }
}
